const router = require("koa-router")();
const nodemailer = require("nodemailer");
const knex = require("./../utils/myKnex");

let timer = null;
// 获取邮箱验证码接口
router.post("/email", async (ctx) => {
  // 接受前端发送过来的数据
  // 这里接受前端发过来的邮箱账号
  const { emailAccount } = ctx.request.body;

  // 创建连接对象
  const transporter = nodemailer.createTransport({
    host: "smtp.qq.com", // 服务 由于我用的QQ邮箱
    secure: true, // 安全的发送模式
    secureConnection: false,
    port: 465, // smtp端口 默认无需改动
    auth: {
      user: "1524187180@qq.com", // 发件人邮箱
      pass: "", // 授权码  ---》这里填写你刚才获取到的授权码即可
    },
  });

  // 随机生成6位数验证码
  // 方式一：
  // const code = Math.ceil(Math.random() * (1000000 - 1000) + 1000);
  // 方式二：
  const code = () => {
    // 生成6位随机数
    let code = "";
    for (let i = 0; i < 6; i++) {
      code += parseInt(Math.random() * 10);
    }
    return code;
  };

  // 生成6位的验证码
  const codeNumber = code();
  // 发送邮箱
  transporter.sendMail(
    {
      // 发件人
      from: "1524187180@qq.com",
      // 收件人
      to: String(emailAccount),
      // 邮箱标题
      subject: "欢迎使用工院派大星, 迎接更高效的校园生活",
      // 邮箱内容
      text: `【工院派大星】验证码${codeNumber}，您正在身份验证，请勿泄露，谨防被骗。`,
    },
    (err, data) => {
      if (err) {
        console.log("发送失败：" + err);
        ctx.body = {
          code: 201,
          messge: "邮箱不合法",
        };
        transporter.close(); // 如果没用，关闭连接池
      } else {
        console.log("发送成功");

        // 操作email表数据库
        // 新增操作
        // hero是表名
        knex("email")
          .insert({
            // insert写对象即可 key就是字段的名字
            emailAccount: String(emailAccount),
            emailCode: String(codeNumber),
          })
          .then((res) => {
            // res 可以获取到 新增数据的 id
            // 数据插入成功之后 执行 then 回调函数
            console.log("数据添加数据库成功！");
          });

        // 为了保证邮箱的唯一性，需要在n时间内删除该条记录
        // 5分钟后从数据库中删除（且在5分钟类使用了该验证码则该验证码失效！！！）（从数据库中删除）
        const delay = 1000 * 60 * 5;
        timer = setTimeout(() => {
          knex("email")
            .delete()
            .where({
              emailAccount: String(emailAccount),
            })
            .then((res) => {
              console.log("删除记录成功，" + res);
            });
        }, delay);

        ctx.body = {
          code: 200,
          messge: "发送成功！",
        };
      }
    }
  );
});

// 邮箱登录接口
router.post("/login", async (ctx) => {
  // 拿到前端邮箱账号和验证码
  const { emailAccount, emailCode } = ctx.request.body;

  // 从数据库中查询数据
  const result = await knex("email")
    .select()
    .where({
      emailAccount: String(emailAccount),
    });

  // 以最后一次接受的验证码为主（前端需要节流，不能一直访问后台数据）
  // 验证码输入正确（拿到前端传过来的邮箱账号和邮箱验证码在数据库中查找是否存在并且还要保证邮箱验证码一致）
  if (
    result[result.length - 1].emailAccount == String(emailAccount) &&
    result[result.length - 1].emailCode == String(emailCode)
  ) {
    ctx.body = {
      code: 200,
      message: "success",
    };
    // 调用后立马删除数据库email表中的当前账号所有信息
    knex("email")
      .delete()
      .where({
        emailAccount: String(emailAccount),
      })
      .then((res) => {
        console.log("res：+" + res);
        clearTimeout(timer);
      });
  } else {
    // 错误
    ctx.body = {
      code: 201,
      message: "验证码错误",
    };
  }
});

module.exports = router;
